package cn.micai.base.concurrent;

import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

import java.util.HashSet;
import java.util.Set;

/**
 * PersonSet示范了限制与锁如何协同确保一个类的线程安全性，即使它的组件状态变量并不是线程安全的。非线程安全的HaseSet管理着PersonSet的状态。
 * 不过由于mySet是私有的，不会溢出，因此HashSet被限制在PersonSet中。唯一可以访问mySet的代码路径是addPerson和containsPerson，执行它们都要
 * 获得PersonSet的锁。PersonSet的内部锁保护了它所有的状态，因而确保了PersonSet是线程安全的。
 */
@ThreadSafe
public class PersonSet {

    @GuardedBy("this")
    private final Set<Person> mySet = new HashSet<Person>();

    public synchronized void addPerson(Person p) {
        mySet.add(p);
    }

    public synchronized boolean containsPerson(Person p) {
        return mySet.contains(p);
    }

    /*public static void main(String [] args) {

        AtomicReference<Integer> personAtomicReference = new AtomicReference<Integer>();

        personAtomicReference.set(20);

        personAtomicReference.compareAndSet(20, 20+2);

        System.out.println(personAtomicReference.get());

    }*/

}
